package com.future;

import java.util.Arrays;

/**
 * Description:
 * 在 MATLAB 中，有一个非常有用的函数 reshape ，它可以将一个 m x n 矩阵重塑为另一个大小不同（r x c）的新矩阵，但保留其原始数据。
 * 给你一个由二维数组 mat 表示的 m x n 矩阵，以及两个正整数 r 和 c ，分别表示想要的重构的矩阵的行数和列数。
 * 重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
 * 如果具有给定参数的 reshape 操作是可行且合理的，则输出新的重塑矩阵；否则，输出原始矩阵。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * <p>
 * 输入：mat = [[1,2],[3,4]], r = 1, c = 4
 * 输出：[[1,2,3,4]]
 * 示例 2：
 * <p>
 * <p>
 * 输入：mat = [[1,2],[3,4]], r = 2, c = 4
 * 输出：[[1,2],[3,4]]
 *  
 * <p>
 * 提示：
 * <p>
 * m == mat.length
 * n == mat[i].length
 * 1 <= m, n <= 100
 * -1000 <= mat[i][j] <= 1000
 * 1 <= r, c <= 300
 * <p>
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reshape-the-matrix
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2021/9/27 15:00
 */
public class Solution_matrixReshap_566 {

    public static void main(String[] args) {
        int[][] mat = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
        int r = 2;
        int c = 6;
        int[][] ints = matrixReshape(mat, r, c);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(Arrays.toString(ints[i]));
        }
        System.out.println("======");
        ints = matrixReshape_v2(mat, r, c);
        for (int i = 0; i < ints.length; i++) {
            System.out.println(Arrays.toString(ints[i]));
        }
    }

    /**
     * 推理过程（自己写的，看这里就行）
     * 3*4：
     * 1, 2, 3, 4
     * 5, 6, 7, 8
     * 9, 10,11,12
     * =>2*6
     * 1, 2, 3, 4, 5, 6
     * 7, 8, 9,10, 11,12
     * (下面用下3*4的下标表示)
     * 00 01 02 03 10 11
     * 12 13 20 21 22 23
     * =>
     * 00 01 02 03 04 05
     * 10 11 12 13 14 15
     *
     * @param mat
     * @param r
     * @param c
     * @return
     */
    public static int[][] matrixReshape_v2(int[][] mat, int r, int c) {
        if (mat == null) {
            return mat;
        }
        int row = mat.length;
        int col = mat[0].length;
        // 个数对不匹配，直接退出
        if (row * col != r * c) {
            return mat;
        }
        int initRow = 0;
        int initCol = 0;
        int[][] resultArr = new int[r][c];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                if (initCol != 0 && initCol % col == 0) {
                    // 走到原始二维数组的末尾，行数加一，列数重新开始
                    initRow++;
                    initCol = 0;
                }
                resultArr[i][j] = mat[initRow][initCol++];
            }
        }
        return resultArr;
    }

    /**
     * 这是答案
     *
     * @param nums
     * @param r
     * @param c
     * @return
     */
    public static int[][] matrixReshape(int[][] nums, int r, int c) {
        int m = nums.length;
        int n = nums[0].length;
        if (m * n != r * c) {
            return nums;
        }

        int[][] ans = new int[r][c];
        for (int x = 0; x < m * n; ++x) {
            ans[x / c][x % c] = nums[x / n][x % n];
        }
        return ans;
    }

}
